#include "tp2.h"
#include <my_global.h>
#include <mysql.h>

extern MYSQL *myconn;
MYSQL_RES *myresult;
MYSQL_ROW myrow;

bool_t query_1_svc(char **argp, char **result, struct svc_req *rqstp) {
	char *buf = (char *) malloc(QUERY_RESULT_SIZE * sizeof(char));
	int numfields;
	int idx = 0;				//deslocamento no buf (utilizado para concatenacao)
	int i;					//para contador

	/* mostra o cliente com sua query */
	printf("%s: %s\n",((struct authunix_parms *) rqstp->rq_clntcred)->aup_machname, *argp);
	fflush(stdout);
	if (mysql_query(myconn, *argp) != 0) {
		fprintf(stderr, "query falhou.\n");
		free(buf);
		exit(1);
	}

	myresult = mysql_store_result(myconn);
	if (myresult == NULL) {		//se a consulta ao banco for "INSERT" ou "DELETE"
		strcpy(buf, "NULL");
		*result = buf;			//isso evita que seja gerado um "can't decode results" no cliente, como retorno da rpc
	} else {					//se consulta ao banco for "SELECT"
		numfields = mysql_num_fields(myresult);
		while ((myrow = mysql_fetch_row(myresult))) {
			for (i = 0; i < numfields; i++)
				idx += sprintf(&buf[idx], "%s | ", myrow[i] ? myrow[i] : "NULL");
			idx -= 3; //retira o último " | "
			buf[idx++] = '\n'; //cada tupla numa linha separada
		}
		buf[idx] = '\0'; //fecha a string
		*result = buf;
	}
	mysql_free_result(myresult);
	return TRUE;
}

int tp2_prog_1_freeresult(SVCXPRT * transp, xdrproc_t xdr_result, caddr_t result) {
	/* desaloca a memória alocada por:
	 * - XDR
	 * - char *buf, alocada na função query_1_svc() logo acima. */
	xdr_free(xdr_result, result);
	return 1;
}
